home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / admin / linuxcon.000 / linuxcon / linuxconf-1.6 / userconf / group.c < prev    next >
C/C++ Source or Header  |  1996-06-15  |  4KB  |  200 lines

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <grp.h>
  5. #include "internal.h"
  6. #include "userconf.h"
  7. #include "../paths.h"
  8. #include "../misc/misc.h"
  9. #include "userconf.m"
  10.  
  11. static USERCONF_HELP_FILE help_group ("group");
  12.  
  13. PRIVATE void GROUP::settbmem (char **members)
  14. {
  15.     tbmem.delall();
  16.     if (members != NULL){
  17.         int i=0;
  18.         while (members[i] != NULL){
  19.             tbmem.add (new SSTRING(members[i]));
  20.             i++;
  21.         }
  22.     }
  23. }
  24.  
  25. PRIVATE void GROUP::init(
  26.     const char *_name,
  27.     const char *_passwd,
  28.     int _gid,
  29.     char **members)
  30. {
  31.     name.setfrom (_name);
  32.     passwd.setfrom(_passwd);
  33.     gid = _gid;
  34.     settbmem (members);
  35. }
  36.  
  37. PUBLIC GROUP::GROUP(
  38.     const char *_name,
  39.     const char *_passwd,
  40.     int _gid,
  41.     char **members)
  42. {
  43.     init (_name,_passwd,_gid,members);
  44. }
  45.  
  46. PUBLIC GROUP::GROUP()
  47. {
  48.     init ("","",-1,NULL);
  49. }
  50. PUBLIC GROUP::GROUP(struct group *p)
  51. {
  52.     init (p->gr_name,p->gr_passwd,p->gr_gid,p->gr_mem);
  53. }
  54. PUBLIC GROUP::~GROUP()
  55. {
  56. }
  57.  
  58. /*
  59.     Write one record of /etc/passwd
  60. */
  61. PUBLIC void GROUP::write(FILE *fout)
  62. {
  63.     fprintf (fout,"%s:%s:%d:",name.get(),passwd.get(),gid);
  64.     char *sep = "";
  65.     int nb = tbmem.getnb();
  66.     for (int i=0; i<nb; i++){
  67.         fputs (sep,fout);
  68.         fputs (tbmem.getitem(i)->get(),fout);
  69.         sep = ",";
  70.     }
  71.     fputc ('\n',fout);
  72. }
  73.  
  74. PUBLIC const char *GROUP::getname()
  75. {
  76.     return name.get();
  77. }
  78. PUBLIC int GROUP::getgid()
  79. {
  80.     return gid;
  81. }
  82.  
  83. /*
  84.     Check if a group is correctly configured.
  85.     Return -1 if not.
  86. */
  87. PRIVATE int GROUP::check(
  88.     USERS &users,
  89.     GROUPS &groups,
  90.     GROUP *realone)
  91. {
  92.     char status[1000];
  93.     status[0] = '\0';
  94.     GROUP *other = groups.getitem(name.get());
  95.     if (other != NULL && other != realone){
  96.         strcat (status,MSG_U(E_GROUPEXIST,"Group already exist\n"));
  97.     }
  98.     other = groups.getfromgid(gid);
  99.     if (other != NULL && other != realone){
  100.         strcat (status,MSG_U(E_GROUPEXISTID
  101.             ,"Group already exist (Group ID)\n"));
  102.     }
  103.     int nb = tbmem.getnb();
  104.     for (int i=0; i<nb; i++){
  105.         const char *user = tbmem.getitem(i)->get();
  106.         if (users.getitem(user)==NULL){
  107.             strcat (status,MSG_U(E_UNKNOWNMEMBER,"Unknown member user "));
  108.             strcat (status,user);
  109.             strcat (status,"\n");
  110.         }
  111.     }
  112.     int ret = 0;
  113.     if (status[0] != '\0'){
  114.         xconf_error ("%s",status);
  115.         ret = -1;
  116.     }
  117.     return ret;
  118. }
  119.  
  120. static char **group_parsemem (const char *str, int &nb)
  121. {
  122.     nb = 0;
  123.     char **ret = (char**)malloc_err (100*sizeof(char*));
  124.     while (str[0] != '\0'){
  125.         str = str_skip(str);
  126.         char member[200];
  127.         char *ptmem = member;
  128.         while (*str > ' ') *ptmem++ = *str++;
  129.         if (ptmem > member){
  130.             *ptmem = '\0';
  131.             ret[nb++] = strdup(member);
  132.         }
  133.     }
  134.     ret[nb] = NULL;
  135.     return ret;
  136. }
  137.  
  138. /*
  139.     Edit the specification of a user.
  140.     Return -1 if the user escape without accepting the changes.
  141.     Return 0 if the record was changed
  142.     Return 1 if the record must be deleted
  143. */
  144. PUBLIC int GROUP::edit(USERS &users, GROUPS &groups)
  145. {
  146.     DIALOG dia;
  147.     dia.newf_str (MSG_U(F_GROUPNAME,"Group name"),name);
  148.     if (gid == -1) gid = groups.getnew();
  149.     dia.newf_num (MSG_U(F_GROUPID,"Group ID"),gid);
  150.     SSTRING altmem;
  151.     for (int i=0; i<tbmem.getnb(); i++){
  152.         altmem.append (tbmem.getitem(i)->get());
  153.         altmem.append (" ");
  154.     }
  155.     dia.newf_str (MSG_U(F_ALTMEM,"Alternate members(opt)"),altmem);
  156.  
  157.     int field = 0;
  158.     int ret = -1;
  159.     while (1){
  160.         MENU_STATUS code = dia.edit(MSG_U(T_GROUPSPEC,"Group specification")
  161.             ,MSG_U(INTRO_GROUPSPEC,"You must specify at least the name\n")
  162.             ,help_group.getpath()
  163.             ,field
  164.             ,MENUBUT_ACCEPT|MENUBUT_CANCEL|MENUBUT_DEL);
  165.         if (code == MENU_CANCEL || code == MENU_ESCAPE){
  166.             dia.restore();
  167.             break;
  168.         }else if (perm_rootaccess(
  169.             MSG_U(P_GROUPDB,"to maintain the group database"))){
  170.             if (code == MENU_DEL){
  171.                 if (xconf_areyousure(MSG_U(Q_DELGROUP
  172.                     ,"Confirm deletion of group definition"))){
  173.                     ret = 1;
  174.                     break;
  175.                 }
  176.             }else{
  177.                 if (name.strchr(':')!=NULL
  178.                     || altmem.strchr(':')!=NULL){
  179.                     xconf_error (MSG_R(E_NO2PT));
  180.                 }else{
  181.                     int newgid = gid;
  182.                     int nb;
  183.                     char **members = group_parsemem (altmem.get(),nb);
  184.                     GROUP tmp(name.get(),passwd.get(),newgid,members);
  185.                     if (tmp.check(users,groups,this)==0){
  186.                         settbmem (members);
  187.                         ret = 0;
  188.                         break;
  189.                     }
  190.                     tbstr_free (members,nb);
  191.                     free (members);
  192.                 }
  193.             }
  194.         }
  195.     }
  196.     return ret;
  197. }
  198.  
  199.  
  200.